package com.springframework.beans.factory.annotation;

import com.springframework.beans.factory.config.MyBeanDefinition;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.MethodMetadata;
import org.springframework.lang.Nullable;

/**
 * @Author 虎哥
 * @Description 定义注解类的元信息，例如通过 @Component 注解定义的 Bean，那么注解类的元信息会包含编译后的 .class 文件的所有信息
 * <p>
 * 要带着问题去学习,多猜想多验证
 **/
public interface MyAnnotatedBeanDefinition extends MyBeanDefinition {

    /**
     * AnnotationMetadata 可以获取到定义 Bean 的所有信息，在 Spring 底层会通过 ASM（一个操作 Java 字节码与分析的框架）实现的
     * @return
     */
    AnnotationMetadata getMetadata();

    /**
     * MethodMetadata 可以获取到工厂方法的元信息，目前我没发现哪里使用到
     * 例如通过 @Component 注解定义的 Bean，那么 AnnotationMetadata 可以获取到这个 Class 对象的所有信息
     *
     * @return
     */
    @Nullable
    MethodMetadata getFactoryMethodMetadata();
}
